package com.ruoyi.web.controller.haode;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.map.MapUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.web.controller.common.BaseController;
import com.ruoyi.web.controller.haode.mapper.PcApiMapper;
import com.ruoyi.web.controller.haode.domain.PageData;
import com.ruoyi.web.controller.tool.ExpiringMapUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import sun.applet.Main;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;

/**
 * 昊德看板界面
 * 
 * @author wuy
 */
@Controller
@RequestMapping("/haode/v1")
public class HaodeController extends BaseController
{
    private static final Logger log = LoggerFactory.getLogger(HaodeController.class);
    private String prefix = "haode";

    @Autowired
    PcApiMapper pcApiMapper;

    Map<String,Long> mapKey = new HashMap<>();
    PageData commonPd = new PageData();
    Map<String,Long> mapDtxd = new HashMap<>();//饼图数据
    Map<String,Long> mapDtxy = new HashMap<>();//饼图数据
    Map<String,Long> mapJtxy = new HashMap<>();//饼图数据
    Map<String,Long> mapZong = new HashMap<>();//饼图数据
    List<String> e1Alist =  new ArrayList<>();
    List<String> e1Blist =  new ArrayList<>();
    List<String> e1Tcname =  new ArrayList<>();


    List<PageData> commonTitle =  new ArrayList<>();
    List<PageData> commonDtxd =  new ArrayList<>();
    List<PageData> commonDtxy =  new ArrayList<>();
    List<PageData> commonJtxy =  new ArrayList<>();
    List<PageData> commpnMap= new ArrayList<>();


    static DecimalFormat df = new DecimalFormat("0.0");
    // 系统介绍
    @RequiresPermissions("haode:v1:quanzhouindex")
    @GetMapping("/quanzhouindex")
    public String main(ModelMap mmap)
    {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        PageData pd =  new PageData(request);
        if(StringUtils.isBlank(pd.getString("tabId"))){
            pd.put("tabId", 1);
        }
        mmap.put("pd", pd);
        return prefix+"/quanzhouindex";
    }

    /**
     * 通用折线图数据
     */
    @RequiresPermissions("haode:v1:quanzhouindex")
    @PostMapping("/quanzhou/getMap")
    @ResponseBody
    public AjaxResult getMap(@RequestBody PageData queryPd) throws Exception
    {
        try
        {
                if(queryPd.getString("type").equals("1")){
                    mapKey= new HashMap<>();
                    mapDtxd= new HashMap<>();
                    mapDtxy= new HashMap<>();
                    if(queryPd.getString("tabId").equals("1")){
                        commonPd.put("patientType",null);//null 全部查询出来
                        commonTitle = pcApiMapper.listDayCommon(commonPd);
                        commonPd.put("patientType","0");// 0（动态）   5 （静态）  6（血压）
                        commonDtxd = pcApiMapper.listDayCommon(commonPd);
                        commonPd.put("patientType","6");// 0（动态）   5 （静态）  6（血压）
                        commonDtxy = pcApiMapper.listDayCommon(commonPd);
                        commonPd.put("patientType","5");// 0（动态）   5 （静态）  6（血压）
                        commonJtxy = pcApiMapper.listDayCommon(commonPd);
                        commpnMap = pcApiMapper.listMapDay(new PageData());
                    }else if(queryPd.getString("tabId").equals("2")){
                        commonPd.put("patientType",null);//null 全部查询出来
                        commonTitle = pcApiMapper.listMonthCommon(commonPd);
                        commonPd.put("patientType","0");// 0（动态）   5 （静态）  6（血压）
                        commonDtxd = pcApiMapper.listMonthCommon(commonPd);
                        commonPd.put("patientType","6");// 0（动态）   5 （静态）  6（血压）
                        commonDtxy = pcApiMapper.listMonthCommon(commonPd);
                        commonPd.put("patientType","5");// 0（动态）   5 （静态）  6（血压）
                        commonJtxy = pcApiMapper.listMonthCommon(commonPd);
                        commpnMap = pcApiMapper.listMapMonth(new PageData());
                    }else if(queryPd.getString("tabId").equals("3")){
                        commonPd.put("patientType",null);//null 全部查询出来
                        commonTitle = pcApiMapper.listYearQuarterCommon(commonPd);
                        commonPd.put("patientType","0");// 0（动态）   5 （静态）  6（血压）
                        commonDtxd = pcApiMapper.listYearQuarterCommon(commonPd);
                        commonPd.put("patientType","6");// 0（动态）   5 （静态）  6（血压）
                        commonDtxy = pcApiMapper.listYearQuarterCommon(commonPd);
                        commonPd.put("patientType","5");// 0（动态）   5 （静态）  6（血压）
                        commonJtxy = pcApiMapper.listYearQuarterCommon(commonPd);
                        commpnMap = pcApiMapper.listMapYearQuarter(new PageData());
                    }else if(queryPd.getString("tabId").equals("4")){
                        commonPd.put("patientType",null);//null 全部查询出来
                        commonTitle = pcApiMapper.listYearMonthCommon(commonPd);
                        commonPd.put("patientType","0");// 0（动态）   5 （静态）  6（血压）
                        commonDtxd = pcApiMapper.listYearMonthCommon(commonPd);
                        commonPd.put("patientType","6");// 0（动态）   5 （静态）  6（血压）
                        commonDtxy = pcApiMapper.listYearMonthCommon(commonPd);
                        commonPd.put("patientType","5");// 0（动态）   5 （静态）  6（血压）
                        commonJtxy = pcApiMapper.listYearMonthCommon(commonPd);
                        commpnMap = pcApiMapper.listMapYearMonth(new PageData());
                    }else if(queryPd.getString("tabId").equals("5")){
                        commonPd.put("patientType",null);//null 全部查询出来
                        commonTitle = pcApiMapper.listYearCommon(commonPd);
                        commonPd.put("patientType","0");// 0（动态）   5 （静态）  6（血压）
                        commonDtxd = pcApiMapper.listYearCommon(commonPd);
                        commonPd.put("patientType","6");// 0（动态）   5 （静态）  6（血压）
                        commonDtxy = pcApiMapper.listYearCommon(commonPd);
                        commonPd.put("patientType","5");// 0（动态）   5 （静态）  6（血压）
                        commonJtxy = pcApiMapper.listYearCommon(commonPd);
                        commpnMap = pcApiMapper.listMap(new PageData());
                    }
                    List<Map<String,Object>> data=new ArrayList<>();
                    List<Object> mapDataList;
                    Map<String,Object> mapData;
                    Map<String,List<String>> geoCoordMap=new HashMap<>();
                    for (PageData pageData : commpnMap) {
                        if(!StringUtils.isBlank(pageData.getString("map_lnglat"))){
                            geoCoordMap.put(pageData.getString("map_title"), Arrays.asList(pageData.getString("map_lnglat").split(",")));
                            if(!mapKey.containsKey(pageData.getString("map_title"))){//不存在的经纬度就放一起
                                mapKey.put(pageData.getString("map_title"),Long.valueOf(pageData.getString("map_dtxd"))+Long.valueOf(pageData.getString("map_dtxy"))+Long.valueOf(pageData.getString("map_jtxy")));
                            }else{
                                mapKey.put(pageData.getString("map_title"),mapKey.get(pageData.getString("map_title"))+Long.valueOf(pageData.getString("map_dtxd"))+Long.valueOf(pageData.getString("map_dtxy"))+Long.valueOf(pageData.getString("map_jtxy")));
                            }
                            if(!mapDtxd.containsKey(pageData.getString("map_title"))) {//不存在的经纬度就放一起
                                mapDtxd.put(pageData.getString("map_title"),Long.valueOf(pageData.getString("map_dtxd")));
                                mapDtxy.put(pageData.getString("map_title"),Long.valueOf(pageData.getString("map_dtxy")));
                                mapJtxy.put(pageData.getString("map_title"),Long.valueOf(pageData.getString("map_jtxy")));
                                mapZong.put(pageData.getString("map_title"),mapDtxd.get(pageData.getString("map_title"))+mapDtxy.get(pageData.getString("map_title"))+mapJtxy.get(pageData.getString("map_title")));
                            }else{
                                mapDtxd.put(pageData.getString("map_title"),mapDtxd.get(pageData.getString("map_title"))+Long.valueOf(pageData.getString("map_dtxd")));
                                mapDtxy.put(pageData.getString("map_title"),mapDtxy.get(pageData.getString("map_title"))+Long.valueOf(pageData.getString("map_dtxy")));
                                mapJtxy.put(pageData.getString("map_title"),mapJtxy.get(pageData.getString("map_title"))+Long.valueOf(pageData.getString("map_jtxy")));
                                mapZong.put(pageData.getString("map_title"),mapDtxd.get(pageData.getString("map_title"))+mapDtxy.get(pageData.getString("map_title"))+mapJtxy.get(pageData.getString("map_title")));
                            }
                        }
                    }
                    List<PageData> pdMapDist = pcApiMapper.listMapDist(new PageData());
                    for (PageData pageData : pdMapDist) {
                        if(!StringUtils.isBlank(pageData.getString("map_lnglat"))){
                            geoCoordMap.put(pageData.getString("map_title"), Arrays.asList(pageData.getString("map_lnglat").split(",")));
                        }
                        mapDataList=new ArrayList<>();
                        mapData=new HashMap<>();
                        mapData.put("counts",mapKey.get(pageData.getString("map_title"))==0?"":mapKey.get(pageData.getString("map_title")));
                        mapDataList.add(22*mapData.get("counts").toString().length());
                        mapDataList.add(pageData.getString("map_content")
                                +"<br/>"+"动态心电"+mapDtxd.get(pageData.getString("map_title"))+"例"
                                +"<br/>"+"静态心电"+mapJtxy.get(pageData.getString("map_title"))+"例"
                                +"<br/>"+"动态血压"+mapDtxy.get(pageData.getString("map_title"))+"例"
                                +"<br/>"+"共"+mapZong.get(pageData.getString("map_title"))+"例"
                        );
                        mapData.put("name",pageData.getString("map_title"));
                        mapData.put("value",mapDataList);
                        data.add(mapData);
                    }
                    AjaxResult ajax = AjaxResult.success();
                    ajax.put("geoCoordMap", geoCoordMap);
                    ajax.put("data", data);
                    return ajax;
                }else  if(queryPd.getString("type").equals("2")){
                    if(mapKey.size()>0){
                        e1Alist.clear();
                        e1Blist.clear();
                        e1Tcname.clear();
                        Long dtxd = 0l;
                        Long dtxy = 0l;
                        Long jtxd = 0l;
                        for(String key : mapDtxd.keySet()){
                            dtxd = dtxd+mapDtxd.get(key);
                            dtxy = dtxy+mapDtxy.get(key);
                            jtxd = jtxd+mapJtxy.get(key);
                        }
                        e1Alist.add(dtxd+"");
                        String e1_dtxd = df.format((float)dtxd/(dtxd+dtxy));
                        if(new BigDecimal(e1_dtxd).compareTo(BigDecimal.ZERO)==0){
                            e1Blist.add("2");
                        }else if(new BigDecimal(e1_dtxd).compareTo(new BigDecimal(0.5))>=0){
                            e1Blist.add("5");
                        }else if(new BigDecimal(e1_dtxd).compareTo(new BigDecimal(0.08))>=0){
                            e1Blist.add("3");
                        }else{
                            e1Blist.add(e1_dtxd);
                        }
                        e1Tcname.add("动态心电");
                        e1Alist.add(dtxy+"");
                        String e1_dtxy = df.format((float)dtxy/(dtxd+dtxy));
                        if(new BigDecimal(e1_dtxy).compareTo(BigDecimal.ZERO)==0){
                            e1Blist.add("2");
                        }else if(new BigDecimal(e1_dtxy).compareTo(new BigDecimal(0.5))>=0){
                            e1Blist.add("5");
                        }else if(new BigDecimal(e1_dtxy).compareTo(new BigDecimal(0.08))>=0){
                            e1Blist.add("3");
                        }else{
                            e1Blist.add(e1_dtxy);
                        }
                        e1Tcname.add("动态血压");
                        e1Alist.add(jtxd+"");
                        e1Blist.add("2");
                        e1Tcname.add("静态心电");
                        AjaxResult ajax = AjaxResult.success();
                        ajax.put("e1Alist", e1Alist);
                        ajax.put("e1Blist", e1Blist);
                        ajax.put("e1Tcname", e1Tcname);
                        return ajax;
                    }else{
                        AjaxResult ajax = AjaxResult.success();
                        ajax.put("e1Alist", e1Alist);
                        ajax.put("e1Blist", e1Blist);
                        ajax.put("e1Tcname", e1Tcname);
                        return ajax;
                    }
                }else if(queryPd.getString("type").equals("3")){
                    List<String> yearTitle =  new ArrayList<>();
                    List<String> yearDtxdNum =  new ArrayList<>();
                    List<String> yearDtxyNum =  new ArrayList<>();
                    List<String> yearJtxdNum =  new ArrayList<>();
                    Map<String,String> mapYearDtxy = new HashMap<>();
                    for (PageData xypageData : commonDtxy) {
                        mapYearDtxy.put(xypageData.getString("years"),xypageData.getString("years_num"));
                    }
                    Map<String,String> mapYearJtxy = new HashMap<>();
                    for (PageData xypageData : commonJtxy) {
                        mapYearJtxy.put(xypageData.getString("years"),xypageData.getString("years_num"));
                    }
                    Map<String,String> mapYearDtxd = new HashMap<>();
                    for (PageData xypageData : commonDtxd) {//遍历心电的年份
                        mapYearDtxd.put(xypageData.getString("years"),xypageData.getString("years_num"));
                    }
                    for (PageData pageData : commonTitle) {//遍历心电的年份
                        yearTitle.add(pageData.getString("years"));
                        yearDtxdNum.add(mapYearDtxd.containsKey(pageData.getString("years"))?mapYearDtxd.get(pageData.getString("years")):"0");
                        yearDtxyNum.add(mapYearDtxy.containsKey(pageData.getString("years"))?mapYearDtxy.get(pageData.getString("years")):"0");
                        yearJtxdNum.add(mapYearJtxy.containsKey(pageData.getString("years"))?mapYearJtxy.get(pageData.getString("years")):"0");
                    }
                    AjaxResult ajax = AjaxResult.success();
                    ajax.put("yearTitle", yearTitle);
                    ajax.put("yearDtxdNum", yearDtxdNum);
                    ajax.put("yearDtxyNum", yearDtxyNum);
                    ajax.put("yearJtxdNum", yearJtxdNum);
                    return ajax;
                }else if(queryPd.getString("type").equals("4")){
                    List<PageData> yearZx =  new ArrayList<>();
                    List<PageData> jsonValList;

                    Map<String,String> mapYearDtxy = new HashMap<>();
                    for (PageData xypageData : commonDtxy) {
                        mapYearDtxy.put(xypageData.getString("years"),xypageData.getString("years_num"));
                    }
                    Map<String,String> mapYearJtxy = new HashMap<>();
                    for (PageData xypageData : commonJtxy) {
                        mapYearJtxy.put(xypageData.getString("years"),xypageData.getString("years_num"));
                    }
                    Map<String,String> mapYearDtxd = new HashMap<>();
                    for (PageData xypageData : commonDtxd) {//遍历心电的年份
                        mapYearDtxd.put(xypageData.getString("years"),xypageData.getString("years_num"));
                    }
                    PageData jsonVal;
                    PageData jsonValRe;
                    for (PageData pageData : commonTitle) {//遍历心电的年份
//                    {"time":"06-01","result":[{"name":"静态心电","value":3},{"name":"动态心电","value":3.6},{"name":"动态血压","value":2.7}]}
                        jsonValList=new ArrayList<>();
                        jsonValRe=new PageData();
                        jsonValRe.put("time",pageData.getString("years"));
                        jsonVal=new PageData();
                        jsonVal.put("name","静态心电");
                        jsonVal.put("value",mapYearJtxy.containsKey(pageData.getString("years"))?mapYearJtxy.get(pageData.getString("years")):"0");
                        jsonValList.add(jsonVal);
                        jsonVal=new PageData();
                        jsonVal.put("name","动态心电");
                        jsonVal.put("value",mapYearDtxd.containsKey(pageData.getString("years"))?mapYearDtxd.get(pageData.getString("years")):"0");
                        jsonValList.add(jsonVal);
                        jsonVal=new PageData();
                        jsonVal.put("name","动态血压");
                        jsonVal.put("value",mapYearDtxy.containsKey(pageData.getString("years"))?mapYearDtxy.get(pageData.getString("years")):"0");
                        jsonValList.add(jsonVal);
                        jsonValRe.put("result",jsonValList);
                        yearZx.add(jsonValRe);
                    }
                    AjaxResult ajax = AjaxResult.success();
                    ajax.put("yearZx", JSON.toJSONString(yearZx));
                    if(queryPd.getString("tabId").equals("1")){
                        ajax.put("yearTitle", "医院每小时检查走势图");
                    }else if(queryPd.getString("tabId").equals("2")){
                        ajax.put("yearTitle", "医院本月检查走势图");
                    }else if(queryPd.getString("tabId").equals("3")){
                        ajax.put("yearTitle", "医院本季检查走势图");
                    }else if(queryPd.getString("tabId").equals("4")){
                        ajax.put("yearTitle", "医院本年检查走势图");
                    }else if(queryPd.getString("tabId").equals("5")){
                        ajax.put("yearTitle", "历年医院检查走势图");
                    }
                    return ajax;
                }else if(queryPd.getString("type").equals("5")){


                    List<Map.Entry<String, Long>> list = new ArrayList<>(mapZong.entrySet());
                    Collections.sort(list, new Comparator<Map.Entry<String, Long>>()
                    {
                        @Override
                        public int compare(Map.Entry<String, Long> o1, Map.Entry<String, Long> o2)
                        {
                            //按照value值，重小到大排序
//                return o1.getValue() - o2.getValue();

                            //按照value值，从大到小排序
//                return o2.getValue() - o1.getValue();

                            //按照value值，用compareTo()方法默认是从小到大排序
                            return o1.getValue().compareTo(o2.getValue());
                        }
                    });
                    List<String> strNameList=new ArrayList<>();
                    List<String> strNameValList=new ArrayList<>();
                    for (Map.Entry s : list){
                        strNameList.add(s.getKey().toString());
                        strNameValList.add(mapZong.get(s.getKey().toString())+"");
                    }
                    AjaxResult ajax = AjaxResult.success();
                    ajax.put("strNameList", strNameList);
                    ajax.put("strNameValList", strNameValList);
                    return ajax;
                }
            return null;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }


    public static void main(String[] args) {
        System.out.println(df.format((float)4000/(4000+1000)));
    }

    /**
     * 通用折线图数据
     */
    @RequiresPermissions("system:map:add")
    @PostMapping("/map/add")
    @ResponseBody
    public AjaxResult mapAdd(@RequestBody PageData queryPd) throws Exception
    {
        try
        {
            int pdMap = pcApiMapper.insertMapAdd(new PageData());
            AjaxResult ajax = AjaxResult.success();
            ajax.put("data", pdMap);
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }



}
